home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / osrc.arc / CMDPARSE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-28  |  3.2 KB  |  142 lines

  1. /* Parse command line, set up command arguments Unix-style, and call function.
  2.  * Note: argument is modified (delimiters are overwritten with nulls)
  3.  * Improved error handling by Brian Boesch of Stanford University
  4.  */
  5. #include <stdio.h>
  6. #include "global.h"
  7. #include "cmdparse.h"
  8. #include "proc.h"
  9.  
  10. int
  11. cmdparse(cmds,line,envp)
  12. struct cmds cmds[];
  13. register char *line;
  14. void *envp;
  15. {
  16.     struct cmds *cmdp;
  17.     char *argv[NARG],*cp;
  18.     int argc,qflag;
  19.     struct proc *pp;
  20.  
  21.     /* Remove cr/lf */
  22.     rip(line);
  23.  
  24.     for(argc = 0;argc < NARG;argc++)
  25.         argv[argc] = NULLCHAR;
  26.  
  27.     for(argc = 0;argc < NARG;){
  28.         qflag = 0;
  29.         /* Skip leading white space */
  30.         while(*line == ' ' || *line == '\t')
  31.             line++;
  32.         if(*line == '\0')
  33.             break;
  34.         /* Check for quoted token */
  35.         if(*line == '"'){
  36.             line++;    /* Suppress quote */
  37.             qflag = 1;
  38.         }
  39.         argv[argc++] = line;    /* Beginning of token */
  40.         /* Find terminating delimiter */
  41.         if(qflag){
  42.             /* Find quote, it must be present */
  43.             if((line = strchr(line,'"')) == NULLCHAR){
  44.                 return -1;
  45.             }
  46.             *line++ = '\0';
  47.         } else {
  48.             /* Find space or tab. If not present,
  49.              * then we've already found the last
  50.              * token.
  51.              */
  52.             if((cp = strchr(line,' ')) == NULLCHAR
  53.              && (cp = strchr(line,'\t')) == NULLCHAR){
  54.                 break;
  55.             }
  56.             *cp++ = '\0';
  57.             line = cp;
  58.         }
  59.     }
  60.     if (argc < 1) {        /* empty command line */
  61.         argc = 1;
  62.         argv[0] = "";
  63.     }
  64.     /* Lines beginning with "#" are comments */
  65.     if(argv[0] == NULLCHAR || argv[0][0] == '#')
  66.         return 0;
  67.  
  68.     /* Look up command in table; prefix matches are OK */
  69.     for(cmdp = cmds;cmdp->name != NULLCHAR;cmdp++){
  70.         if(strncmp(argv[0],cmdp->name,strlen(argv[0])) == 0)
  71.             break;
  72.     }
  73.     if(cmdp->name == NULLCHAR) {
  74.         if(cmdp->argc_errmsg != NULLCHAR) 
  75.             printf("%s\n",cmdp->argc_errmsg);
  76.         return -1;
  77.     } else {
  78.         if(argc < cmdp->argcmin) {
  79.             /* Insufficient arguments */
  80.             printf("Usage: %s\n",cmdp->argc_errmsg);
  81.             return -1;
  82.         } else {
  83.             if(cmdp->stksize == 0){
  84.                 return (*cmdp->func)(argc,argv,envp);
  85.             } else {
  86.                 pp = newproc(cmdp->name,cmdp->stksize,
  87.                 (void (*)())cmdp->func,argc,argv,envp);
  88.                 pwait(pp);
  89.                 return(0);
  90.             }
  91.         }
  92.     }
  93. }
  94.  
  95. /* Call a subcommand based on the first token in an already-parsed line */
  96. int
  97. subcmd(tab,argc,argv,envp)
  98. struct cmds tab[];
  99. int argc;
  100. char *argv[];
  101. void *envp;
  102. {
  103.     register struct cmds *cmdp;
  104.     struct proc *pp;
  105.     int found = 0;
  106.  
  107.     /* Strip off first token and pass rest of line to subcommand */
  108.     if (argc < 2) {
  109.         if (argc < 1)
  110.             printf("SUBCMD - Don't know what to do?\n");
  111.         else
  112.             printf("\"%s\" - takes at least one argument\n",argv[0]);
  113.         return -1;
  114.     }
  115.     argc--;
  116.     argv++;
  117.     for(cmdp = tab;cmdp->name != NULLCHAR;cmdp++){
  118.         if(strncmp(argv[0],cmdp->name,strlen(argv[0])) == 0){
  119.             found = 1;
  120.             break;
  121.         }
  122.     }
  123.     if(!found){
  124.         if(cmdp->argc_errmsg != NULLCHAR)
  125.             printf("%s\n",cmdp->argc_errmsg);
  126.         return -1;
  127.     }
  128.     if(argc < cmdp->argcmin){
  129.         if(cmdp->argc_errmsg != NULLCHAR)
  130.             printf("Usage: %s\n",cmdp->argc_errmsg);
  131.         return -1;
  132.     }
  133.     if(cmdp->stksize == 0){
  134.         return (*cmdp->func)(argc,argv,envp);
  135.     } else {
  136.         pp = newproc(cmdp->name,cmdp->stksize,
  137.         (void (*)())cmdp->func,argc,argv,envp);
  138.         pwait(pp);
  139.         return(0);
  140.     }
  141. }
  142.